#ifndef DRIVESUBSYSTEM_H
#define DRIVESUBSYSTEM_H

// Include files.
#include "WPILib.h"
#include "RobotSubsystem.hpp"

/**
 *  The DriveSubsystem class is a base class for all drive subsystems.
 *  This class can not be used by itself.
 */
class DriveSubsystem :
	public RobotSubsystem
{
	public:
		/**
		 *  The ControlMode enum is currently used only for CANJaguar control modes.
		 *  
		 *  We hope in the future to support different modes given only normal motor controllers and corresponding encoders.
		 */
		enum ControlMode
		{
			ControlModePercentVBus = CANJaguar::kPercentVbus,
			ControlModeSpeed = CANJaguar::kSpeed,
			ControlModeDistance = CANJaguar::kPosition,
			ControlModeVoltage = CANJaguar::kVoltage,
			ControlModeCurrent = CANJaguar::kCurrent,
		};
		
		/**
		 *  The SpeedReference enum is currently used only for CANJaguar speed modes.
		 *  
		 *  We hope in the future to support different modes given only normal motor controllers and corresponding encoders.
		 */
		enum SpeedReference
		{
			SpeedReferenceNothing = CANJaguar::kSpeedRef_None,
			SpeedReferenceEncoder = CANJaguar::kSpeedRef_Encoder,
			SpeedReferenceInvertedEncoder = CANJaguar::kSpeedRef_InvEncoder,
			SpeedReferenceQuadEncoder = CANJaguar::kSpeedRef_QuadEncoder,
		};
		
		/**
		 *  The DistanceReference enum is currently used only for CANJaguar position modes.
		 *  
		 *  We hope in the future to support different modes given only normal motor controllers and corresponding encoders.
		 */
		enum DistanceReference
		{
			DistanceReferenceNothing = CANJaguar::kPosRef_None,
			DistanceReferenceQuadEncoder = CANJaguar::kPosRef_QuadEncoder,
			DistanceReferencePotentiometer = CANJaguar::kPosRef_Potentiometer,
		};
		
		/**
		 *  The NeutralMode enum is currently used only for CANJaguar neutral modes.
		 *  
		 *  We hope in the future to support different modes given only normal motor controllers.
		 */
		enum NeutralMode
		{
			NeutralModeJumper = CANJaguar::kNeutralMode_Jumper,
			NeutralModeBrake = CANJaguar::kNeutralMode_Brake,
			NeutralModeCoast = CANJaguar::kNeutralMode_Coast,
		};
};

#endif // #ifndef DRIVESUBSYSTEM_H 
